<?php

class Modulo
{
	private $idModulo;
	private $idCurso;
	private $titulo;
	private $apresentacao;
	private $ordem;
	private $idUsuario;
	private $dataHoraInsercao;
	private $idUsuarioUltimaModificacao;
	private $dataHoraUltimaModificacao;
	private $visivel;
	
	public function Modulo($idModulo) {
		$strQuery	=	"SELECT * FROM modulos WHERE idModulo = " . $idModulo;
		if ($resultado	=	BancoDados::query($strQuery)){
			$this->setIdModulo($idModulo);
			$this->setIdCurso($resultado[0]['idCurso']);
			$this->setTitulo($resultado[0]['titulo']);
			$this->setApresentacao($resultado[0]['apresentacao']);
			$this->setOrdem($resultado[0]['ordem']);
			$this->setIdUsuario($resultado[0]['idUsuario']);
			$this->setDataHoraInsercao($resultado[0]['dataHoraInsercao']);
			$this->setIdUsuarioUltimaModificacao($resultado[0]['idUsuarioUltimaModificacao']);
			$this->setVisivel($resultado[0]['visivel']);
		}
		else {
			$this->setIdModulo(null);
		}
	}
	
	public function configuraMenu($urlCurso, $nomeModuloCurso) {
		$objAssociacoes	=	new Associacoes($this->getIdCurso(), $this->getIdModulo(), 'modulos', $urlCurso, $nomeModuloCurso);
		$associacoes	=	$objAssociacoes->getAssociacoes(true);
		
		$arrayCategoriasPreenchidas	=	array();
		$arrayCategoriasVazias		=	array();
		
		foreach ($associacoes as $chave => $associacoesCategoria) {
			$associacoesCategoria['qtdItens']	=	sizeof($associacoesCategoria);
			switch ($chave) {
				case texto('AREA_AVISOS'):
					$associacoesCategoria['url']	=	montaLink(array('curso', $urlCurso, 'modulo', $this->getIdModulo(), 'avisos'));
					break;
				case texto('AREA_GLOSSARIO'):
					$associacoesCategoria['url']	=	montaLink(array('curso', $urlCurso, 'modulo', $this->getIdModulo(), 'glossario'));
					break;
				case texto('AREA_BIBLIOGRAFIA'):
					$associacoesCategoria['url']	=	montaLink(array('curso', $urlCurso, 'modulo', $this->getIdModulo(), 'bibliografia'));
					break;
				case texto('AREA_LINKS'):
					$associacoesCategoria['url']	=	montaLink(array('curso', $urlCurso, 'modulo', $this->getIdModulo(), 'links'));
					break;
				case texto('AREA_RECURSOS'):
					$associacoesCategoria['url']	=	montaLink(array('curso', $urlCurso, 'modulo', $this->getIdModulo(), 'recursos'));
					break;
				case $nomeModuloCurso:
					$associacoesCategoria['url']	=	montaLink(array('curso', $urlCurso, 'modulo', $this->getIdModulo(), 'modulos'));
					break;
			}
			if ($associacoesCategoria['qtdItens'] == 0) {
				$arrayCategoriasVazias[$chave]		=	$associacoesCategoria;
			}
			else {
				$arrayCategoriasPreenchidas[$chave]	=	$associacoesCategoria;
			}
		}
		uksort($arrayCategoriasVazias, 'comparaStringCanonizar');
		uksort($arrayCategoriasPreenchidas, 'comparaStringCanonizar');
		return array('arrayCategoriasPreenchidas' => $arrayCategoriasPreenchidas, 'arrayCategoriasVazias' => $arrayCategoriasVazias);
	}
	
	public static function inserir($idCurso, $idUsuario, $strTitulo, $strApresentacao, $strVisivel) {
		if (Modulo::validar($strTitulo, $strApresentacao, $strVisivel)) {
			$strVisivel		=	$strVisivel	==	'sim' ? 'true': 'false';
			
			$strQueryOrdem	=	"SELECT (SELECT COUNT(*) FROM modulos WHERE idCurso = " . $idCurso . ") + 1 as ordem;";
			if (!is_array($resultado = BancoDados::query($strQueryOrdem))){
				return false;
			}
			$ordem	=	$resultado[0]['ordem'];
			
			$strQuery		=	"INSERT INTO modulos VALUES (default, " . $idCurso . ", '" . $strTitulo . "', '" . $strApresentacao . "'," . $ordem . ", " . $idUsuario . ", NOW(), " . $idUsuario . ", NOW(), " . $strVisivel . ");";
			if (BancoDados::query($strQuery)) {
				$strQuery	=	"SELECT idModulo FROM modulos WHERE idCurso = " . $idCurso . " AND idUsuario = " . $idUsuario . " AND titulo = \"" . $strTitulo . "\" AND apresentacao = \"" . $strApresentacao . "\" AND visivel = " . $strVisivel . " ORDER BY idModulo DESC LIMIT 1";
				if (is_array($resultado = BancoDados::query($strQuery))) {
					if (sizeof($resultado) > 0) {
						return $resultado[0]['idModulo'];
					}
					else {
						return true;
					}
				}
				else {
					return true;
				}
			}
			else {
				return false;
			}
		}
		else {
			return false;
		}
	}
	
	public static function editar($idModulo, $strTitulo, $strApresentacao, $strVisibilidade, $ordemPretendida, $funcaoOrdenar, $idUsuario) {
		$strQueryPrincipal	=	"UPDATE modulos SET ";
		if (!is_null($strTitulo) || !is_null($strApresentacao) || !is_null($strVisibilidade)) {
			if (!Modulo::validar($strTitulo, $strApresentacao, $strVisibilidade))
				return false;
			else{
				$strVisibilidade		=	$strVisibilidade	==	'sim' ? 'true': 'false';
				$strQueryPrincipal	.=	"titulo = '" . $strTitulo . "', apresentacao = '" . $strApresentacao . "', visivel = " . $strVisibilidade . ", ";
			}
		}	
		if (!is_null($funcaoOrdenar) || !is_null($ordemPretendida)) {
			$strQuery	=	"SELECT ordem,idCurso from modulos WHERE idModulo = " . $idModulo . ";";
			if(!is_array($resultado	=	BancoDados::query($strQuery))) {
				return false;
			}
			$ordemAtual			=	$resultado[0]['ordem'];
			$idCurso			=	$resultado[0]['idCurso'];
			if (!is_null($funcaoOrdenar))
				$ordemPretendida	=	$funcaoOrdenar == 'subir' ? $ordemAtual - 1 : $ordemAtual + 1;
		}
		
		if ($ordemPretendida != null) {
			if ($ordemPretendida < $ordemAtual)
				$strQuery	=	"UPDATE modulos SET ordem = (ordem + 1) WHERE ordem >= " . $ordemPretendida . " AND ordem < " . $ordemAtual . " AND idCurso = " . $idCurso . ";";
			else
				$strQuery	=	"UPDATE modulos SET ordem = (ordem - 1) WHERE ordem <= " . $ordemPretendida . " AND ordem > " . $ordemAtual . " AND idCurso = " . $idCurso . ";";
			if(!BancoDados::query($strQuery)) {
				return false;
			}
			$strQueryPrincipal	.=	"ordem = " . $ordemPretendida . ", ";
		}
		
		$strQueryPrincipal .= "idUsuarioUltimaModificacao = " . $idUsuario . ", dataHoraUltimaModificacao = NOW() WHERE idModulo = " . $idModulo;
		
		if(!BancoDados::query($strQueryPrincipal)) {
			email(constant('EMAIL_ADM'), 'ERRO', null, 'EMAIL_ERRO_EDICAO_ORDEM_MODULO', array($idModulo));
			return false;
		}
		return true;
	}
	
	public static function excluir ($idModulos) {
		if ($idModulos != "") {
			$arrayIdModulos	=	explode(", ", $idModulos);
			$sucesso	=	true;
			foreach ($arrayIdModulos as $idModuloAtual) {
				$strQuery	=	"DELETE FROM associacoes WHERE (idElemento1 = " . $idModuloAtual . " AND elemento1 = \"modulos\") OR (idElemento2 = " . $idModuloAtual . " AND elemento2 = \"modulos\")";
				if (!BancoDados::query($strQuery)) {
					$sucesso	=	false;
				}
			}
			if ($sucesso) {
				$strQueryPegarOrdem	=	"SELECT idModulo, ordem, idCurso FROM modulos WHERE idModulo in (" . $idModulos . ")";
				if(!is_array($arrayResultados	=	BancoDados::query($strQueryPegarOrdem))) {
					return false;
				}
				
				$arrayModulos	=	explode(", ", $idModulos);
				$idCurso		=	$arrayResultados[0]['idCurso'];
				
				foreach($arrayResultados as $resultado) {
					$ordem[$resultado['idModulo']]	=	$resultado['ordem'];	
				}
				
				foreach ($arrayModulos as $idModulo) {
					$strQueryMudarOrdem	=	"UPDATE modulos SET ordem = (ordem - 1) WHERE ordem > " . $ordem[$idModulo] . " AND idCurso = " . $idCurso;
					if(!BancoDados::query($strQueryMudarOrdem)) {
						return false;
					}
				}
				$strQuery =	"DELETE FROM modulos WHERE idModulo in (" . $idModulos . ")";
				if(!BancoDados::query($strQuery)) {
					email(constant('EMAIL_ADM'), 'ERRO', null, 'EMAIL_ERRO_DELECAO_MODULO', array($idModulos));
					return false;
				}
				return true;
			}
			else {
				return false;
			}
		}
		else {
			adicionaMensagem(texto('MENSAGEM_NENHUM_ITEM_SELECIONADO'), 'erro');
			return true;
		}
	}
	
	public static function validar($strTitulo, $strApresentacao, $strVisivel) {
		$validou	=	true;
		//Valida o Titulo do Modulo
		if (!validaAlfaNumerico($strTitulo, constant('__TAM_TITULO_MODULO__'))) {
			$validou             =    false;
			adicionaMensagem(texto('MENSAGEM_ERRO_VALIDACAO_CAMPO_INPUT', array(texto('DADOS_TITULO_DO_MODULO'))), 'erro');	
		}
		
		//Valida o Descricao do Modulo
		if ($strApresentacao == "") {
			$validou             =    false;
			adicionaMensagem(texto('MENSAGEM_ERRO_VALIDACAO_CAMPO_INPUT', array(texto('DADOS_DESCRICAO_DO_MODULO'))), 'erro');	
		}
		
		//Valida a Visibilidade do Modulo
		if ($strVisivel != 'sim' && $strVisivel != 'nao') {
			$validou             =    false;
			adicionaMensagem(texto('MENSAGEM_ERRO_VALIDACAO_CAMPO_SELECT', array(texto('DADOS_VISIBILIDADE_MODULO'))), 'erro');
		}
		
		return $validou;
	}
	
	public static function buscarNomenclaturas ($idUsuario = NULL, $padrao = true) {		
		$strQuery1	=	"SELECT DISTINCT null as idNomenclaturaPadrao, nomeModulo as nomenclatura FROM cursos WHERE idDono = " . $idUsuario . " AND ISNULL(idNomenclaturaPadrao)";
		$strQuery2	=	"SELECT * FROM moduloNomenclaturaPadrao";
		
		$resultado	=	array();
		if (is_null($idUsuario))
			$resultado	=	BancoDados::query($strQuery2 . " ORDER BY nomenclatura");
		else {
			if($padrao) {
				$resultado	=	BancoDados::query($strQuery1 . " UNION " . $strQuery2 . " ORDER BY nomenclatura");
			}
			else
				$resultado	=	BancoDados::query($strQuery1 . " ORDER BY nomenclatura");
		}
		
		if (!is_array($resultado)) {
			adicionaMensagem(texto('MENSAGEM_ERRO_BUSCAR_NOMENCLATURA'), 'erro');
			return false;
		}
		return $resultado;
	}
	
	public static function buscarNomenclaturaPorId($idNomenclatura) {
		$strQuery	=	"SELECT nomenclatura FROM moduloNomenclaturaPadrao WHERE idNomenclaturaPadrao = " . $idNomenclatura . ";";
		if (!is_array($resultado = BancoDados::query($strQuery))) {
			adicionaMensagem(texto('MENSAGEM_ERRO_BUSCAR_NOMENCLATURA'), 'erro');
			return false;
		}
		return $resultado[0]['nomenclatura'];
	}
	
	public static function buscar ($idCurso = NULL, $idUsuario = NULL, $strTitulo = NULL, $strNomenclatura = NULL, $padrao = null, $ordenacaoAtual = NULL, $ordemAtual = NULL, $resultadosPagina = NULL, $paginaAtual = NULL) {
		if (Modulo::validarBusca($idCurso, $idUsuario, $strTitulo, $strNomenclatura, $padrao)) {						
			$strQuery	=	"SELECT modulos.* FROM modulos";
			
			$strQuery	.=	(!is_null($strNomenclatura) || !is_null($padrao)) ?  " INNER JOIN cursos ON modulos.idCurso = cursos.idCurso WHERE " : " WHERE ";
			
			$strQuery	.=	!is_null($idUsuario) ? "modulos.idUsuario = " . $idUsuario . " AND " : "";
			$strQuery	.=	!is_null($idCurso) ? "modulos.idCurso = " . $idCurso . " AND " : "";
			$strQuery	.=	!is_null($strNomenclatura) ? (is_numeric($strNomenclatura) ? "cursos.idNomenclaturaPadrao = " . $strNomenclatura . " AND " : "cursos.nomeModulo = '" . $strNomenclatura . "' AND " ) : "";
			$strQuery	.=	!is_null($padrao) ? ($padrao ? "!ISNULL(idNomenclaturaPadrao) AND " : "ISNULL(cursos.idNomenclaturaPadrao) AND " ) : "";
			
			$arrayTitulo		=	!is_null($strTitulo) ? explode(' ', $strTitulo) : array();
			foreach ($arrayTitulo as $titulo) {
				$strQuery	.=	"modulos.titulo REGEXP '.*" . $titulo . ".*' AND ";
			}
			
			//CONSERTANDO FINAL DA QUERY
			$strQuery	=	preg_replace('/ WHERE $/', ' ', $strQuery);
			$strQuery	=	preg_replace('/ AND $/', ' ', $strQuery);
			
			$strQuery	.=	' GROUP BY modulos.idModulo';
			$strQueryCount	=	'SELECT COUNT(*) AS qtdResultados FROM (' . $strQuery . ') AS queryOriginal;';
			
			if ($resultadoCount = BancoDados::query($strQueryCount)) {
				foreach($resultadoCount as $resultado) {
					$qtdResultados	=	$resultado['qtdResultados'];
				}
				
				if ($qtdResultados > 0) {
					$paginaAtual	=	$paginaAtual == NULL ? 1 : $paginaAtual;
					$ordenacaoAtual	=	$ordenacaoAtual == NULL ? 'ordem' : $ordenacaoAtual;
					$ordemAtual		=	$ordemAtual == NULL ? 'ASC' : ($ordemAtual == 'desc' ? 'DESC' : 'ASC');
					
					$strQuery	.=	' ORDER BY ' . $ordenacaoAtual . ' ' . $ordemAtual;
					
					if ($resultadosPagina != NULL) {
						$qtdPaginas		=	ceil($qtdResultados / $resultadosPagina);
						$qtdPaginas		=	$qtdPaginas == 0 ? 1 : $qtdPaginas;
						
						$strQuery		.=	' LIMIT ' . $resultadosPagina . ' OFFSET ' . (($paginaAtual - 1) * $resultadosPagina);
					}
					else {
						$qtdPaginas	=	1;
					}
					
					$strQuery	.=	';';
					
					$resultado	=	BancoDados::query($strQuery);
					
					if (is_array($resultado)) {
						return array ('listaResultados' => $resultado, 'qtdResultadosPagina' => sizeof($resultado), 'qtdResultadosTotal' => $qtdResultados, 'qtdPaginas' => $qtdPaginas);
					}
					else {
						return false;
					}
				}
				else {
					return array('listaResultados' => array(), 'qtdResultadosPagina' => 0, 'qtdResultadosTotal' => 0, 'qtdPaginas' => 0);
				}
			}
			else {
				return false;
			}
		}
		else {
			return false;
		}
	}
	
	public static function validarBusca($idCurso, $idUsuario, $strTitulo, $strNomenclatura, $padrao) {
		return true;
	}
	
	/**
     * Returns $idModulo.
     * @see Curso::$idModulo
     */
    public function getIdModulo()
    {
        return $this->idModulo;
    }
    
    /**
     * Sets $idModulo.
     * @param object $idModulo
     * @see Curso::$idModulo
     */
    public function setIdModulo($idModulo)
    {
        $this->idModulo = $idModulo;
    }
    
	/**
     * Returns $idCurso.
     * @see Curso::$idCurso
     */
    public function getIdCurso()
    {
        return $this->idCurso;
    }
    
    /**
     * Sets $idCurso.
     * @param object $idCurso
     * @see Curso::$idCurso
     */
    public function setIdCurso($idCurso)
    {
        $this->idCurso = $idCurso;
    }
    
	/**
     * Returns $titulo.
     * @see Curso::$titulo
     */
    public function getTitulo()
    {
        return $this->titulo;
    }
    
    /**
     * Sets $titulo.
     * @param object $titulo
     * @see Curso::$titulo
     */
    public function setTitulo($titulo)
    {
        $this->titulo = $titulo;
    }
	
	/**
     * Returns $apresentacao.
     * @see Curso::$apresentacao
     */
    public function getApresentacao()
    {
        return $this->apresentacao;
    }
    
    /**
     * Sets $apresentacao.
     * @param object $apresentacao
     * @see Curso::$apresentacao
     */
    public function setApresentacao($apresentacao)
    {
        $this->apresentacao = $apresentacao;
    }
    
	/**
     * Returns $ordem.
     * @see Curso::$ordem
     */
    public function getOrdem()
    {
        return $this->ordem;
    }
    
    /**
     * Sets $ordem.
     * @param object $ordem
     * @see Curso::$ordem
     */
    public function setOrdem($ordem)
    {
        $this->ordem = $ordem;
    }
    
	/**
     * Returns $idUsuario.
     * @see Curso::$idUsuario
     */
    public function getIdUsuario()
    {
        return $this->idUsuario;
    }
    
    /**
     * Sets $idUsuario.
     * @param object $idUsuario
     * @see Curso::$idUsuario
     */
    public function setIdUsuario($idUsuario)
    {
        $this->idUsuario = $idUsuario;
    }
    
	/**
     * Returns $dataHoraInsercao.
     * @see Curso::$dataHoraInsercao
     */
    public function getDataHoraInsercao()
    {
        return $this->dataHoraInsercao;
    }
    /**
     * Sets $dataHoraInsercao.
     * @param object $dataHoraInsercao
     * @see Curso::$dataHoraInsercao
     */
    public function setDataHoraInsercao($dataHoraInsercao)
    {
        $this->dataHoraInsercao = $dataHoraInsercao;
    }
	
	/**
     * Returns $idUsuarioUltimaModificacao.
     * @see Curso::$idUsuarioUltimaModificacao
     */
    public function getIdUsuarioUltimaModificacao()
    {
        return $this->idUsuarioUltimaModificacao;
    }
    
    /**
     * Sets $idUsuarioUltimaModificacao.
     * @param object $idUsuarioUltimaModificacao
     * @see Curso::$idUsuarioUltimaModificacao
     */
    public function setIdUsuarioUltimaModificacao($idUsuarioUltimaModificacao)
    {
        $this->idUsuarioUltimaModificacao = $idUsuarioUltimaModificacao;
    }
    
	/**
     * Returns $dataHoraUltimaModificacao.
     * @see Curso::$dataHoraUltimaModificacao
     */
    public function getDataHoraUltimaModificacao()
    {
        return $this->dataHoraUltimaModificacao;
    }
    
    /**
     * Sets $dataHoraUltimaModificacao.
     * @param object $dataHoraUltimaModificacao
     * @see Curso::$dataHoraUltimaModificacao
     */
    public function setDataHoraUltimaModificacao($dataHoraUltimaModificacao)
    {
        $this->dataHoraUltimaModificacao = $dataHoraUltimaModificacao;
    }
    
	/**
     * Returns $visivel.
     * @see Curso::$visivel
     */
    public function getVisivel()
    {
        return $this->visivel;
    }
    
    /**
     * Sets $visivel.
     * @param object $visivel
     * @see Curso::$visivel
     */
    public function setVisivel($visivel)
    {
        $this->visivel = $visivel;
    }
	
}
?>